﻿/********************************************************************************/
/* 	keypad.d																	*/
/*------------------------------------------------------------------------------*/
/*	製作		（　゜ワ゜）ノ　／　松久貫太									*/
/*	製作開始　	2007/05/11														*/
/*	MAIL		omega@personal.email.ne.jp										*/
/*	URL		http://nagoya.cool.ne.jp/o_mega										*/
/*																				*/
/*	このソースは「やわらかライセンス」の元で配布されています。					*/
/*-更新履歴---------------------------------------------------------------------*/
/*	2007/--/--																	*/
/*-その他-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/

/* ライブラリのインポート *******************************************************/
private import hell2;		// dHell2ライブラリ
private import std.file;
private import std.stream;
private import std.stdio;

class Keypad
{
	int player = -1;
	this(int player = 0)
	{
		this.player = player;
	}
	
	/*
	 * エンターキーを押している(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 押しているならtrue
	 */
	bool isPressEnter()
	{
		if(Hell_isPressKey(HELL_z) && player == 0) return true;
		if(Hell_isPressKey(HELL_SPACE) && player == 0) return true;
		if(Hell_isPressJButton(0 , player))  return true;
		return false;
	}

	/*
	 * エンターキーを押した(KeyDown)か
	 * 引数   : 
	 * 戻り値 : 押したならtrue
	 */
	bool isPushEnter()
	{
		if(Hell_isPushKey(HELL_z) && player == 0) return true;
		if(Hell_isPushKey(HELL_SPACE) && player == 0) return true;
		if(Hell_isPushJButton(0 , player))  return true;
		return false;
	}

	/*
	 * キャンセルキーを押しているか(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 押しているならtrue
	 */
	bool isPushCancel()
	{	
		if(Hell_isPushKey(HELL_x) && player == 0) return true;
		if(Hell_isPushJButton(1 , player))  return true;
		return false;
	}

	// Press

	/*
	 * 左キーを押している(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 左キーを押しているならtrue
	 */
	bool isPressLeft()
	{
		if(Hell_isPressKey(HELL_LEFT) && player == 0)    return true;
		if(Hell_isPressJKey(HELL_J_LEFT , player)) return true;
		return false;
	}
	/*
	 * 上キーを押している(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 上キーを押しているならtrue
	 */
	bool isPressUp()
	{
		if(Hell_isPressKey(HELL_UP) && player == 0)    return true;
		if(Hell_isPressJKey(HELL_J_UP , player)) return true;
		return false;
	}
	/*
	 * 右キーを押している(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 右キーを押しているならtrue
	 */
	bool isPressRight()
	{
		if(Hell_isPressKey(HELL_RIGHT) && player == 0)    return true;
		if(Hell_isPressJKey(HELL_J_RIGHT , player)) return true;
		return false;
	}
	/*
	 * 下キーを押している(KeyPress)か
	 * 引数   : 
	 * 戻り値 : 下キーを押しているならtrue
	 */
	bool isPressDown()
	{
		if(Hell_isPressKey(HELL_DOWN) && player == 0)    return true;
		if(Hell_isPressJKey(HELL_J_DOWN , player)) return true;
		return false;
	}

	// Down

	/*
	 * 左キーを押した(KeyDown)か
	 * 引数   : 
	 * 戻り値 : 左キーを押したならtrue
	 */
	bool isPushLeft()
	{
		if(Hell_isPushKey(HELL_LEFT) && player == 0)    return true;
		if(Hell_isPushJKey(HELL_J_LEFT , player)) return true;
		return false;
	}
	/*
	 * 上キーを押した(KeyDown)か
	 * 引数   : 
	 * 戻り値 : 上キーを押したならtrue
	 */
	bool isPushUp()
	{
		if(Hell_isPushKey(HELL_UP) && player == 0)    return true;
		if(Hell_isPushJKey(HELL_J_UP , player)) return true;
		return false;
	}
	/*
	 * 右キーを押した(KeyDown)か
	 * 引数   : 
	 * 戻り値 : 右キーを押したならtrue
	 */
	bool isPushRight()
	{
		if(Hell_isPushKey(HELL_RIGHT) && player == 0)    return true;
		if(Hell_isPushJKey(HELL_J_RIGHT , player)) return true;
		return false;
	}
	/*
	 * 下キーを押した(KeyDown)か
	 * 引数   : 
	 * 戻り値 : 下キーを押したならtrue
	 */
	bool isPushDown()
	{
		if(Hell_isPushKey(HELL_DOWN) && player == 0)    return true;
		if(Hell_isPushJKey(HELL_J_DOWN , player)) return true;
		return false;
	}
}

//--------------------------------------------------------------------

class MouseState{
	int button;
	int cursor_x;
	int cursor_y;
	
	this(){
		button = cursor_x = cursor_y = 0;
	}
}

class MouseRecorder{
	enum{
		RECORD,
		REPLAY,
	}
	
	const static int RECORDABLE_MAX = 60 * 60 * 10;	// 10分
	
	MouseState[] ms = null;
	int ptr = 0;
	int length = 0;
	int mode;
	
	this(){
		ms = new MouseState[RECORDABLE_MAX];
		foreach(inout m;ms){m = new MouseState();}
		ptr = 0;
		length = 0;
		
		mode = RECORD;
	}
	
	void update(){
		ptr++;
		
		if(mode == RECORD){
			if(ptr >= length) length = ptr + 1;
			
			ms[ptr].cursor_x = Hell_getMouseX();
			ms[ptr].cursor_y = Hell_getMouseY();
			ms[ptr].button = Hell_isPressMouse();
		}else if(mode == REPLAY){
			if(ptr >= length) ptr = length - 1;
		}
	}
	
	void setMode(int mode){
		this.mode = mode;
		this.ptr = 0;
	}
	int getMode(){return mode;}
	
	int getX(){
		if(ptr >= length || ptr < 0) return 0;
		return ms[ptr].cursor_x;
	}
	int getY(){
		if(ptr >= length || ptr < 0) return 0;
		return ms[ptr].cursor_y;
	}
	int isPress(){
		if(ptr >= length || ptr < 0) return 0;
		return ms[ptr].button;
	}
	int isPush(){
		if(ptr >= length || ptr < 1) return 0;
		return ms[ptr].button & (!ms[ptr - 1].button);
	}
	
	//-----
	bool save(string filename){
		auto fp = new BufferedFile();
		fp.create(filename);
		
		for(int ptr=0;ptr<=length;ptr++){
			fp.write(cast(short)ms[ptr].cursor_x);
			fp.write(cast(short)ms[ptr].cursor_y);
			fp.write(cast(short)ms[ptr].button);
		}
		fp.close();
		return true;
	}
	
	bool load(string filename){
		int ptr=0;
		auto fp = new BufferedFile(filename);
		
		try{
			while(!fp.eof()){
				short buf;
				
				fp.read(buf);
				ms[ptr].cursor_x = cast(int)buf;
				
				fp.read(buf);
				ms[ptr].cursor_y = cast(int)buf;
				
				fp.read(buf);
				ms[ptr].button = cast(int)buf;
				ptr++;
			}
		}catch(Exception e){
			Hell_write(e);
		}
		
		length = ptr;
		mode = REPLAY;
		
		return false;
	}
}